package com.qf.factory;

import com.qf.dao.UserDao;
import com.qf.dao.UserDaoImpl;
import com.qf.service.UserService;
import com.qf.service.UserServiceImpl;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/**
 * 我的自定义的工厂
 *   由于同学们不想自己实现对象(new UserDaoImpl)
 *   由Spring工厂帮助我们生产对象
 * @author lixu
 */
public class MyFactory {
    //模拟一个工厂 负责生产对象
    //资源： com.qf.dao.UserDaoImpl 包名+类名
    //反射：自定义的工厂中写的就是反射代码

    //1;工厂负责加载配置文件  只有配置文件中才能包名+类名
    //2:反射：自定义的工厂中写的就是反射代码 由Spring工厂帮助我们生产对象

    //加载配置文件 .properties文件
    private Properties properties = new Properties();//内存

    /**
     * key:userDao  value:com.qf.dao.UserDaoImpl
     * key:userService  value:com.qf.service.UserServiceImpl
     */

    //1：自动加载
/*    static {

    }*/
    //2：人为去调用此方法才能加载
/*    public void loadProperties(){
        //配置文件的加载
    }*/
    //3:构造器中加载配置文件

    /**
     *
     * @param config : 配置文件的位置   /bean.properties
     */
    public MyFactory(String config) {
        try {
            InputStream inputStream = MyFactory.class.getResourceAsStream(config);//相对路径  /resouces
            properties.load(inputStream);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 工厂：生产对象  有包名+类名
     * beanName:userDao 就是同学们想要的对象的Key值
     */
    public Object getBean(String beanName){
        //value:    com.qf.dao.UserDaoImpl
        String value = properties.getProperty(beanName);
        //反射：实例化： 创建对象在Spring的世界叫实例化  创建对象
        try {
            Class<?> aClass = Class.forName(value);
            return aClass.newInstance();//Instance:实例化
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 从自定义工厂中获取出来Bean （Spring容器 ）
     * @param className
     * @return
     * @param <T>
     */
    public <T> T getBean(Class<T> className){
        try {
            return className.newInstance();//Instance:实例化
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    /**
     * 测试工厂
     * @param args
     */
    public static void main(String[] args) {
        //创建工厂的时候 已经加载了配置文件中的内容从磁盘上到内存中
        MyFactory myFactory = new MyFactory("/bean.properties");
        //工厂生产对象
        UserDao userDao = (UserDaoImpl) myFactory.getBean("userDao");
        UserService userService = (UserServiceImpl) myFactory.getBean("userService");


        UserDao userDao1 = myFactory.getBean(UserDao.class);

    }

}
